{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Variable transformers : LogCpTransformer\n",
    "\n",
    "\n",
    "The `LogCpTransformer()` applies the transformation log(x + C), where C is a positive constant, to the input variable. \n",
    "\n",
    "It applies the natural logarithm or the base 10 logarithm, where the natural logarithm is logarithm in base e by setting the param `base=\"e\"` or `base=\"10\"`.\n",
    "\n",
    "The `LogCpTransformer()`  only works with numerical non-negative values after adding a constant C. If the variable contains a zero or a negative value after adding a constant C, the transformer will return an error.\n",
    "\n",
    "The transformer can automatically find the constant C to each variable by setting `C=\"auto\"`.\n",
    "\n",
    "A list of variables can be passed as an argument. Alternatively, the transformer will automatically select and transform all variables of type numeric.\n",
    "\n",
    "In this tutorial we use the boston dataset from [sklearn.datasets](https://scikit-learn.org/stable/datasets/toy_dataset.html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.datasets import load_boston\n",
    "from feature_engine.transformation import LogCpTransformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load dataset\n",
    "X, y = load_boston(return_X_y=True)\n",
    "X = pd.DataFrame(X)\n",
    "\n",
    "# Separate into train and test sets\n",
    "X_train, X_test, y_train, y_test =  train_test_split(X, y, test_size=0.3, random_state=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `LogCpTransformer` automatically finds numerical variables in the dataset by setting `variables=None` or pass a list of column names as the example below shows. \n",
    "\n",
    "Additionally notice that we define the transformer to automatically find the constant C `C=\"auto\"`. Internally, each variable constant is calculated with the formula `C = abs(min(x)) + 1`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_feats = [7, 12]\n",
    "\n",
    "# set up the variable transformer\n",
    "tf = LogCpTransformer(variables=num_feats, C=\"auto\")\n",
    "\n",
    "# fit the transformer\n",
    "tf.fit(X_train)\n",
    "\n",
    "# transform the data\n",
    "train_t= tf.transform(X_train)\n",
    "test_t= tf.transform(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now visualize the results from the transformation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x864 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(12, 12))\n",
    "\n",
    "for idx, col in enumerate(num_feats, start=1):\n",
    "    \n",
    "    # plot un-transformed variable\n",
    "    plt.subplot(2, 2, round(idx*1.4))\n",
    "    plt.title(f'Untransformed variable {col}')\n",
    "    X_train[col].hist()\n",
    "    \n",
    "    # plot transformed variable\n",
    "    plt.subplot(2, 2, idx*2)\n",
    "    plt.title(f'Transformed variable {col}')\n",
    "    train_t[col].hist()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One last thing, to verify the transformed variables we can access the transformer `variables_` attribute"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[7, 12]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.variables_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "or the constant `C` applied through the `C_` attribute."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{7: 2.1742, 12: 2.73}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.C_"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
